#include "TextAnnotation.h"

#include <QTextDocument>
#include <QPainter>
#include <QPixmap>
#include <QPaintEvent>
TextAnnotation::TextAnnotation(QLabel *parent):QTextEdit(parent)
{
    //为这个文本标注窗口设置窗口属性
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setLineWrapMode(QTextEdit::WidgetWidth);//设置edit中的文字超过width自动换行
    setFocus();//将这个文本编辑器设置为焦点事件
    setStyleSheet("background-color:rgba(0,0,0,0);border-width:0.5px;border-style:none;");//设置为无边框

    //正常情况下不block键盘输入
    m_isInputBlocked=false;
}

void TextAnnotation::SetIdealLocation(const QRect &rect)
{
    m_allowRegion=rect;

    //设置文本框的起点和默认宽高为（100，35）
    if(rect.size().height()<=35){
        //当高度不够创建一个文本框时,调整文本框左上角点位的位置
        int h=35-rect.height();//差值
        QPoint top_left=rect.topLeft();
        top_left.setY(top_left.y()-h);//更改左上角点的y坐标
        qDebug()<<"当点击的位置太靠下时调整文本框的输入位置："<<QRect(top_left,QSize(rect.width(),35))<<",原来的区域："<<rect<<"高度差值："<<h;
        setGeometry(QRect(top_left,QSize(rect.width(),35)));
        m_allowRegion=QRect(top_left,QSize(rect.width(),35));
    }else{
        setGeometry(QRect(rect.topLeft(),QSize(rect.width(),35)));
    }
    //设置最大的宽高
    this->setMaximumSize(rect.size());
}

QString TextAnnotation::GetTextContent() const
{
    return this->toPlainText();
}

void TextAnnotation::DrawTextToPixmap(QPainter &painter)
{
    painter.save();//保存画笔的当前状态

    //改变画笔的宽度
    QPen pen=painter.pen();
    pen.setWidth(1);
    painter.setPen(pen);

    QTextDocument *doc=this->document();

    doc->setHtml(this->toHtml());
    doc->setTextWidth(m_allowRegion.width());//限制文本宽度，让其自动换行
    //绘制
    painter.translate(m_allowRegion.topLeft());
    doc->drawContents(&painter,QRect(0,0,m_allowRegion.width(),m_allowRegion.height()));

    painter.restore();//修改颜色之后回退到save 时的状态
    painter.end();
}

void TextAnnotation::AdjustRegion()
{
    bool isUndo=false;
    m_isInputBlocked=false;//打开这个信号
    //动态调整区域的槽函数

    //获取当前的文本输入框的宽和高,测量文本信息的类
    QTextDocument *doc=this->document();
    doc->setTextWidth(m_allowRegion.width());//设置最大宽度，超出时自动换行

    //获取宽高
    qreal content_w=doc->idealWidth();
    qreal content_h=doc->size().height();

    //新的宽度不会随着键入字符动态调整，而是每次都是最大
    int new_w=m_allowRegion.width();
    int new_h=qMin(int (content_h+5),m_allowRegion.height());

    //修改文本框区域
    this->setFixedSize(new_w,new_h);

    //如果文本内容超过允许的最大宽高，文本框停止输入
    if(content_h+5>=m_allowRegion.height()){

        QString text=this->GetTextContent();
        this->blockSignals(true);//暂停触发textchange信号
        isUndo=true;
        //文本框暂停输入,不允许使用
        // setEnabled(false);
        m_isInputBlocked=true;//打开这个信号
        if(isUndo==true){
            this->setPlainText(text.left(text.length()-1));
            this->moveCursor(QTextCursor::End);
            this->blockSignals(false);
        }
        isUndo=false;
    }
    this->update();
}

void TextAnnotation::keyPressEvent(QKeyEvent *e)
{
    //如果窗口区域满了不允许输入了且m_isInputBlocked状态改变成true之后，只允许处理backspace信号，非backspace信号则忽视
    if(m_isInputBlocked==true&&e->key()!=Qt::Key_Backspace){
        e->ignore();
        return;
    }
    //其他情况：
    /// 1.不允许输入，允许删除
    /// 2.允许正常输入
    /// 把键盘事件传递给textedit自带的额键盘事件处理函数处理
    QTextEdit::keyPressEvent(e);
}



